package com.badibadi.fragment;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import com.amap.api.a.ap;
import com.badibadi.infos.ApkInfos;
import com.badibadi.infos.Results;
import com.badibadi.mytools.Constants;
import com.badibadi.mytools.IOUtils;
import com.badibadi.mytools.JSONUtils;
import com.badibadi.mytools.MySharePreferences;
import com.badibadi.mytools.MyThreadTool;
import com.badibadi.mytools.Utils;
import com.badibadi.uniclubber.R;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.app.Dialog;

public class UpdateManager {
	/* 下载中 */
	private static final int DOWNLOAD = 1;
	/* 下载结束 */
	private static final int DOWNLOAD_FINISH = 2;
	/* 保存解析的XML信息 */
	HashMap<String, String> mHashMap;
	/* 下载保存路径 */
	private String mSavePath;
	/* 记录进度条数量 */
	private int progress;
	/* 是否取消更新 */
	private boolean cancelUpdate = false;

	private Context mContext;
	/* 更新进度条 */
	private ProgressBar mProgress;
	private Dialog mDownloadDialog;
	private Results results;
	private ApkInfos apkInfos;
	// 默认是检查更新的（如果为false只检查不更新）
	private boolean isGengxin = true;
	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			// 正在下载
			case DOWNLOAD:
				// 设置进度条位置
				mProgress.setProgress(progress);
				break;
			case DOWNLOAD_FINISH:
				// 安装文件
				installApk();
				break;
			case 3:
				// Utils.ExitPrgress(mContext);
				Utils.showMessage(mContext,
						mContext.getResources().getString(R.string.l_net_error));
				break;
			case 4:
				// Utils.ExitPrgress(mContext);
				checkUpdate();
				break;
			case 5:
				// Utils.ExitPrgress(mContext);
				Utils.showMessage(mContext,
						mContext.getResources().getString(R.string.l_xa10));
				break;
			default:
				break;
			}
		};
	};

	public UpdateManager(Context context) {
		this.mContext = context;
	}

	/**
	 * 检测软件更新
	 */
	public void checkUpdate() {
		
		if(isGengxin==false)//如果只检查不更新
		{
			isUpdate();
		}
		else
		if (isUpdate()) {
			// 显示提示对话框
			showNoticeDialog();
		} else {
			Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG)
					.show();
		}
	}

	/**
	 * 默认是检查之后更新（如果设置为false只检查不更新）
	 * 
	 * @return
	 */
	public void setNolyCheckNoGengxin()
	{
		this.isGengxin=false;
		getApkInfo();
		
	
	}

	/**
	 * 检查软件是否有更新版本
	 * 
	 * @return
	 */
	private boolean isUpdate() {
		// 获取当前软件版本
		int versionCode = getVersionCode(mContext);
//		   
		// 把version.xml放到网络上，然后获取文件信息
		// InputStream inStream =
		// ParseXmlService.class.getClassLoader().getResourceAsStream("version.xml");
		// 解析XML文件。 由于XML文件比较小，因此使用DOM方式进行解析
		// ParseXmlService service = new ParseXmlService();
		// try {
		// String path = Constants.BadiFile;
		// URL url = new URL(path);
		// HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// conn.setReadTimeout(5 * 1000);
		// conn.setRequestMethod("GET");
		// InputStream inStream = conn.getInputStream();
		// if (inStream != null) {
		//    
		// mHashMap = service.parseXml(inStream);
		// } else {
		//    
		// }
		//    
		// } catch (Exception e) {
		//    
		//    
		// }
		// if (null != mHashMap) {
		if(apkInfos!=null)
		{
			if(apkInfos.getVersionCode()!=null)
			{
				int serviceCode = Integer.valueOf(apkInfos.getVersionCode());// Integer.valueOf(mHashMap.get("version"));
				// 版本判断
				if (serviceCode > versionCode) {
					MySharePreferences sp = new MySharePreferences(mContext,
							"isCanGenXin");
					sp.put("isCanGenXin", "1");
					return true;
				}else
				{
					MySharePreferences sp = new MySharePreferences(mContext,
							"isCanGenXin");
					sp.put("isCanGenXin", "0");
					return false;
				}
			}
		}
		return false;
		// MySharePreferences sp=new MySharePreferences(mContext,
		// IOUtils.getSaveObjectPath(mContext, "isCanGenXin"));
		// sp.put("isCanGenXin", false);

	}

	public void getApkInfo() {
		// Utils.showPrgress(mContext);
		MyThreadTool.fixedThreadPool.execute(new Runnable() {
			@Override
			public void run() {
				apkInfos = new ApkInfos();
				Map<String, Object> map = new HashMap<String, Object>();
				String content = Utils.sendRequest(map, Constants.BadiUrl_1
						+ "web/getApkInfo");
				if (content != null) {
					results = Utils.checkResult_NNN(mContext, content);
//					   
					if (results != null && !results.getRetmsg().equals("null")
							&& results.isRet()) {
						try {
							apkInfos = JSONUtils.getEntityByJsonString(
									results.getRetmsg(), ApkInfos.class);
							mHandler.sendEmptyMessage(4);
						} catch (Exception e) {
							// TODO Auto-generated catch block
							   
						}
					} else {
						mHandler.sendEmptyMessage(5);
					}
				} else {
					mHandler.sendEmptyMessage(3);
				}
			}
		});
	}

	/**
	 * 获取软件版本号
	 * 
	 * @param context
	 * @return
	 */
	private int getVersionCode(Context context) {
		int versionCode = 0;
		try {
			// 获取软件版本号，对应AndroidManifest.xml下android:versionCode
			versionCode = context.getPackageManager().getPackageInfo(
					"com.badibadi.uniclubber", 0).versionCode;

		} catch (NameNotFoundException e) {
			   
		}
		return versionCode;
	}

	/**
	 * 显示软件更新对话框
	 */
	private void showNoticeDialog() {
		// 构造对话框
		AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle(R.string.soft_update_title);
		builder.setMessage(R.string.soft_update_info);
		// 更新
		builder.setPositiveButton(R.string.soft_update_updatebtn,
				new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						// 显示下载对话框
						showDownloadDialog();
					}
				});
		// 稍后更新
		builder.setNegativeButton(R.string.soft_update_later,
				new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					}
				});
		Dialog noticeDialog = builder.create();
		noticeDialog.show();
	}

	/**
	 * 显示软件下载对话框
	 */
	private void showDownloadDialog() {
		// 构造软件下载对话框
		AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle(R.string.soft_updating);
		// 给下载对话框增加进度条
		final LayoutInflater inflater = LayoutInflater.from(mContext);
		View v = inflater.inflate(R.layout.softupdate_progress, null);
		mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
		builder.setView(v);
		// 取消更新
		builder.setNegativeButton(R.string.soft_update_cancel,
				new OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						// 设置取消状态
						cancelUpdate = true;
					}
				});
		mDownloadDialog = builder.create();
		mDownloadDialog.show();
		// 现在文件
		downloadApk();
	}

	/**
	 * 下载apk文件
	 */
	private void downloadApk() {
		// 启动新线程下载软件
		new downloadApkThread().start();
	}

	/**
	 * 下载文件线程
	 */
	private class downloadApkThread extends Thread {
		@Override
		public void run() {
			try {
				// 判断SD卡是否存在，并且是否具有读写权限
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					// 获得存储卡的路径
					String sdpath = Environment.getExternalStorageDirectory()
							+ "/";
					mSavePath = sdpath + "download";
					URL url = new URL(Constants.BadiDownloadUrl);
					// 创建连接
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					conn.connect();
					// 获取文件大小
					int length = conn.getContentLength();
					// 创建输入流
					InputStream is = conn.getInputStream();

					File file = new File(mSavePath);
					// 判断文件目录是否存在
					if (!file.exists()) {
						file.mkdir();
					}
					File apkFile = new File(mSavePath,
							apkInfos.getApkFileName());
					FileOutputStream fos = new FileOutputStream(apkFile);
					int count = 0;
					// 缓存
					byte buf[] = new byte[1024];
					// 写入到文件中
					do {
						int numread = is.read(buf);
						count += numread;
						// 计算进度条位置
						progress = (int) (((float) count / length) * 100);
						// 更新进度
						mHandler.sendEmptyMessage(DOWNLOAD);
						if (numread <= 0) {
							// 下载完成
							mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
							break;
						}
						// 写入文件
						fos.write(buf, 0, numread);
					} while (!cancelUpdate);// 点击取消就停止下载.
					fos.close();
					is.close();
				}
			} catch (MalformedURLException e) {
				   
			} catch (IOException e) {
				   
			}
			// 取消下载对话框显示
			mDownloadDialog.dismiss();
		}
	};

	/**
	 * 安装APK文件
	 */
	private void installApk() {
		File apkfile = new File(mSavePath, apkInfos.getApkFileName());
		if (!apkfile.exists()) {
			return;
		}
		// 通过Intent安装APK文件
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
				"application/vnd.android.package-archive");
		mContext.startActivity(i);
	}
}
